#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

m4_define([xcam_major_version], [1])
m4_define([xcam_minor_version], [2])
m4_define([xcam_micro_version], [1])
m4_define([xcam_version], [xcam_major_version.xcam_minor_version.xcam_micro_version])

AC_PREREQ([2.60])
AC_CONFIG_MACRO_DIR([m4])
AC_INIT([libxcam], [xcam_version], [feng.yuan@intel.com], [libxcam])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign subdir-objects])

#xcam version
XCAM_MAJOR_VERSION=xcam_major_version
XCAM_MINOR_VERSION=xcam_minor_version
XCAM_MICRO_VERSION=xcam_micro_version
XCAM_VERSION=xcam_version
XCAM_VERSION_HEX="0x$XCAM_MAJOR_VERSION$XCAM_MINOR_VERSION$XCAM_MICRO_VERSION"
AC_DEFINE_UNQUOTED(XCAM_VERSION, $XCAM_VERSION_HEX,
    [define libxcam version])
AC_SUBST(XCAM_VERSION)

XCAM_LT_VERSION="xcam_major_version:xcam_minor_version:xcam_micro_version"
XCAM_LT_LDFLAGS="-version-number $XCAM_LT_VERSION"
AC_SUBST(XCAM_LT_VERSION)
AC_SUBST(XCAM_LT_LDFLAGS)

#xcam required OpenCV version
XCAM_REQUIRE_CV_MIN=3.0.0
XCAM_REQUIRE_CV_MAX=3.4.3

#xcam required OpenSceneGraph version
XCAM_REQUIRE_OSG_MIN=3.3.2

# Checks for programs.
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
PKG_PROG_PKG_CONFIG
LT_INIT

AC_ARG_ENABLE(debug,
    AS_HELP_STRING([--enable-debug],
                   [enable debug, @<:@default=no@:>@]),
    [], [enable_debug="no"])
AM_CONDITIONAL([DEBUG], [test "$enable_debug" = "yes"])

AC_ARG_ENABLE(profiling,
    AS_HELP_STRING([--enable-profiling],
                   [enable profiling, @<:@default=no@:>@]),
    [], [enable_profiling="no"])

AC_ARG_ENABLE(drm,
    AS_HELP_STRING([--enable-drm],
                   [enable drm buffer, @<:@default=no@:>@]),
    [], [enable_drm="no"])

AC_ARG_ENABLE([aiq],
    AS_HELP_STRING([--enable-aiq],
                   [enable Aiq 3A algorithm build, @<:@default=no@:>@]),
    [], [enable_aiq="no"])

AC_ARG_ENABLE([gst],
    AS_HELP_STRING([--enable-gst],
                   [enable gstreamer plugin build, @<:@default=no@:>@]),
    [], [enable_gst="no"])

AC_ARG_ENABLE(libcl,
    AS_HELP_STRING([--enable-libcl],
                   [enable libcl image processor, @<:@default=yes@:>@]),
    [], [enable_libcl="yes"])

AC_ARG_ENABLE([gles],
    AS_HELP_STRING([--enable-gles],
                   [enable gles, @<:@default=no@:>@]),
    [], [enable_gles="no"])

AC_ARG_ENABLE([vulkan],
    AS_HELP_STRING([--enable-vulkan],
                   [enable vulkan, @<:@default=no@:>@]),
    [], [enable_vulkan="no"])

AC_ARG_ENABLE(opencv,
    AS_HELP_STRING([--enable-opencv],
                   [enable opencv library, @<:@default=no@:>@]),
    [], [enable_opencv="no"])

AC_ARG_ENABLE(capi,
    AS_HELP_STRING([--enable-capi],
                   [enable libxcam-capi library, @<:@default=no@:>@]),
    [], [enable_capi="no"])

AC_ARG_ENABLE([render],
    AS_HELP_STRING([--enable-render],
                   [enable texture render with OpenSceneGraph library, @<:@default=no@:>@]),
    [], [enable_render="no"])
# documentation
AC_ARG_ENABLE(docs,
    [AC_HELP_STRING([--enable-docs],
                    [build Doxygen documentation @<:@default=no@:>@])],
    [], [enable_docs="no"])

AC_ARG_ENABLE([3alib],
    AS_HELP_STRING([--enable-3alib],
                   [enable 3A lib build, @<:@default=no@:>@]),
    [], [enable_3alib="no"])

AC_ARG_ENABLE([smartlib],
    AS_HELP_STRING([--enable-smartlib],
                   [enable smart analysis lib build, @<:@default=no@:>@]),
    [], [enable_smartlib="no"])

# Check for Doxygen
if test "$enable_docs" = "yes"; then
    AC_CHECK_TOOL([DOXYGEN], [doxygen], [no])
    if test "$DOXYGEN" = "no"; then
       enable_docs="no"
    fi
fi
AM_CONDITIONAL(ENABLE_DOCS, test "$enable_docs" = "yes")

# check profiling
ENABLE_PROFILING=0
if test "$enable_profiling" = "yes"; then
    ENABLE_PROFILING=1
fi

# check drm
HAVE_LIBDRM=0
if test "$enable_drm" = "yes"; then
    PKG_CHECK_MODULES(LIBDRM, [libdrm], [HAVE_LIBDRM=1], [HAVE_LIBDRM=0])
fi

# check libcl
HAVE_LIBCL=0
if test "$enable_libcl" = "yes"; then
    PKG_CHECK_MODULES(LIBCL, [libcl], [HAVE_LIBCL=1], [HAVE_LIBCL=0])
fi

# check gl
HAVE_GLES=0
if test "$enable_gles" = "yes"; then
    PKG_CHECK_MODULES(LIBGL, [gl], [HAVE_GLES=1], [HAVE_GLES=0])
fi

# check vulkan
HAVE_VULKAN=0
if test "$enable_vulkan" = "yes"; then
    PKG_CHECK_MODULES(LIBVULKAN, [vulkan], [HAVE_VULKAN=1], [HAVE_VULKAN=0])
fi

# check open sence graph
ENABLE_RENDER=0
if test "$enable_render" = "yes"; then
    PKG_CHECK_MODULES(
        [LIBOSG],
        [openscenegraph-osg >= $XCAM_REQUIRE_OSG_MIN],
        [HAVE_OSG=1],
        [HAVE_OSG=0])

    XCAM_OSG_VERSION=`$PKG_CONFIG --modversion openscenegraph-osg`
    AC_MSG_NOTICE(OpenSceneGraph version: $XCAM_OSG_VERSION)

    if test "$HAVE_OSG" -eq 1; then
        ENABLE_RENDER=1
    else
        AC_MSG_WARN(OpenSceneGraph required version: >= $XCAM_REQUIRE_OSG_MIN)
        ENABLE_RENDER=0
    fi
fi

if test "$enable_libcl" = "yes" && test "$HAVE_LIBCL" -eq 0; then
    PKG_CHECK_MODULES(LIBCL, [OpenCL], [HAVE_LIBCL=1], [HAVE_LIBCL=0])
fi

if test "$HAVE_LIBCL" -eq 1; then
    AC_CHECK_PROGS([GAWK], [gawk], [no])
    if test "x$GAWK" = "xno"; then
        AC_MSG_ERROR([gawk not found])
    fi

    if test "$HAVE_LIBDRM" -eq 1; then
        HAVE_CL_INTEL_H=1
        AC_CHECK_HEADERS([CL/cl_intel.h], [HAVE_CL_INTEL_H=1], [HAVE_CL_INTEL_H=0])
        if test "$HAVE_CL_INTEL_H" -eq 0; then
            # https://raw.githubusercontent.com/intel/beignet/Release_v1.3/include/CL/cl_intel.h
            XCAM_WGET(
                [https://cgit.freedesktop.org/beignet/plain/include/CL/cl_intel.h?id=Release_v1.3.0],
                [./ext/beignet/include/CL/cl_intel.h],
                [6a6619073cb35e6987b7379a5a1a1497])

            CPPFLAGS="$CPPFLAGS -I\$(top_srcdir)/ext/beignet/include"
        fi
    fi
fi

# check opencv version number
HAVE_OPENCV=0
if test "$enable_opencv" = "yes"; then
    PKG_CHECK_MODULES(
        [OPENCV],
        [opencv >= $XCAM_REQUIRE_CV_MIN opencv <= $XCAM_REQUIRE_CV_MAX],
        [HAVE_OPENCV=1],
        [HAVE_OPENCV=0])

    XCAM_CV_VERSION=`$PKG_CONFIG --modversion opencv`
    AC_MSG_NOTICE(OpenCV version: $XCAM_CV_VERSION)

    if test "$HAVE_OPENCV" -eq 0; then
        AC_MSG_ERROR(OpenCV required version: >= $XCAM_REQUIRE_CV_MIN && <= $XCAM_REQUIRE_CV_MAX)
    fi
fi

# check opencv videostab module
ENABLE_DVS=0
if test "$HAVE_OPENCV" -eq 1; then
    AC_LANG(C++)
    saved_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $OPENCV_CFLAGS"
    saved_LIBS="$LIBS"
    LIBS="$LIBS $OPENCV_LIBS"
    AC_CHECK_HEADER([opencv2/videostab.hpp], [ENABLE_DVS=1], [ENABLE_DVS=0])
    CPPFLAGS="$saved_CPPFLAGS"
    LIBS="$saved_LIBS"
fi

# check dvs opencl path
ENABLE_DVS_CL_PATH=0
if test "$HAVE_OPENCV" -eq 1; then
    AC_LANG(C++)
    saved_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $OPENCV_CFLAGS"
    saved_LIBS="$LIBS"
    LIBS="$LIBS $OPENCV_LIBS"
    AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
            [[#include <opencv2/core.hpp>
              #include <opencv2/opencv.hpp>
            ]],
            [[cv::UMat frame0;
              cv::UMat frame1;
              cv::videostab::MotionEstimatorRansacL2 est;
              cv::videostab::KeypointBasedMotionEstimator kpest(&est);
              kpest.estimate(frame0, frame1);
            ]]
           )],
        [ENABLE_DVS_CL_PATH=1],
        [ENABLE_DVS_CL_PATH=0]
    )
    CPPFLAGS="$saved_CPPFLAGS"
    LIBS="$saved_LIBS"
fi

# check capi build
ENABLE_CAPI=0
if test "$enable_capi" = "yes" && test "$HAVE_LIBCL" -eq 1; then
    AC_MSG_NOTICE(enable capi && have libcl: $HAVE_LIBCL)
    ENABLE_CAPI=1
fi

# check AIQ
ENABLE_IA_AIQ=0
USE_LOCAL_AIQ=0
if test "$enable_aiq" = "yes"; then
    ENABLE_IA_AIQ=1
    PKG_CHECK_MODULES(IA_AIQ, ia_imaging,
        PKG_CHECK_EXISTS(ia_imaging >= 2.7,
            AC_DEFINE(HAVE_AIQ_2_7, 1, [defined if module ia_imaging >= v2.0_007 is found])
        ),
        [USE_LOCAL_AIQ=1]
    )

    if test "$USE_LOCAL_AIQ" -eq 1; then
        #check HAVE_AIQ_2_7
        AC_CACHE_CHECK([for ext/ia_imaging >=v2.0_007],
            ac_cv_have_aiq_2_7, [
            saved_CPPFLAGS="$CPPFLAGS"
            CPPFLAGS="$CPPFLAGS -I./ext/ia_imaging/include"
            saved_LIBS="$LIBS"
            LIBS="$LIBS"
            AC_COMPILE_IFELSE(
                [AC_LANG_PROGRAM(
                    [[#include <stdint.h>
                      #include <stdio.h>
                      #include "ia_aiq_types.h"
                    ]],
                    [[ia_aiq_ae_results ae_result;
                      ae_result.flashes = NULL;
                    ]]
                   )],
                [ac_cv_have_aiq_2_7="yes"],
                [ac_cv_have_aiq_2_7="no"]
            )
            CPPFLAGS="$saved_CPPFLAGS"
            LIBS="$saved_LIBS"
        ])

        if test "$ac_cv_have_aiq_2_7" = "yes"; then
            AC_DEFINE(HAVE_AIQ_2_7, 1, [defined if ia_imaging >= v2.0_007 is found])
        fi
    fi

    if test "$USE_LOCAL_AIQ" -eq 0; then
        IA_IMAGING_CFLAGS="$IA_AIQ_CFLAGS"
        IA_IMAGING_LIBS="$IA_AIQ_LIBS"
    else
        IA_IMAGING_CFLAGS="-I\$(top_srcdir)/ext/ia_imaging/include"
        IA_IMAGING_LIBS="-L\$(top_srcdir)/ext/ia_imaging/lib -lia_aiq -lia_isp_2_2 -lia_cmc_parser -lia_mkn -lia_nvm -lia_exc -lia_log"
    fi
    AC_SUBST(IA_IMAGING_CFLAGS)
    AC_SUBST(IA_IMAGING_LIBS)
    LIBS="$LIBS $IA_IMAGING_LIBS"
fi

# check 3a lib build
ENABLE_3ALIB=0
if test "$enable_3alib" = "yes"; then
    ENABLE_3ALIB=1
fi
AM_CONDITIONAL([ENABLE_3ALIB], [test "$ENABLE_3ALIB" -eq 1])

# check smart analysis lib build
ENABLE_SMART_LIB=0
if test "$enable_smartlib" = "yes"; then
    ENABLE_SMART_LIB=1
fi
AM_CONDITIONAL([ENABLE_SMART_LIB], [test "$ENABLE_SMART_LIB" -eq 1])

# check atomisp headers
USE_LOCAL_ATOMISP=0
#AC_CHECK_HEADERS([linux/atomisp.h], [USE_LOCAL_ATOMISP=0], [USE_LOCAL_ATOMISP=1])
AC_CACHE_CHECK([for linux/atomisp.h],
    ac_cv_have_atomisp_headers, [
    saved_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS"
    saved_LIBS="$LIBS"
    LIBS="$LIBS"
    AC_COMPILE_IFELSE(
        [AC_LANG_PROGRAM(
            [[#ifndef __user
              #define __user 
              #endif
              #include <stdint.h>
              #include <stdio.h>
              #include <linux/atomisp.h>]],
            [[struct atomisp_parm param;]]
           )],
        [ac_cv_have_atomisp_headers="yes"],
        [ac_cv_have_atomisp_headers="no" USE_LOCAL_ATOMISP=1]
    )
    CPPFLAGS="$saved_CPPFLAGS"
    LIBS="$saved_LIBS"
])


# build gstreamer plugin
GST_API_VERSION=1.0
GST_VERSION_REQUIRED=1.2.3
ENABLE_GST=0
if test "$enable_gst" = "yes"; then
    ENABLE_GST=1
    PKG_CHECK_MODULES([GST], [gstreamer-$GST_API_VERSION >= $GST_VERSION_REQUIRED])
    PKG_CHECK_MODULES([GST_ALLOCATOR], [gstreamer-allocators-$GST_API_VERSION >= $GST_VERSION_REQUIRED])
    PKG_CHECK_MODULES([GST_VIDEO], [gstreamer-video-$GST_API_VERSION >= $GST_VERSION_REQUIRED])
fi
AM_CONDITIONAL([ENABLE_GST], [test "$ENABLE_GST" -eq 1])

dnl set XCAM_CFLAGS and XCAM_CXXFLAGS
XCAM_CFLAGS=" -fPIC -Wall -fstack-protector"
if test "$enable_debug" = "yes"; then
    XCAM_CFLAGS="$XCAM_CFLAGS -g -DDEBUG"
fi
XCAM_CXXFLAGS="$XCAM_CFLAGS -std=c++0x"
AC_SUBST(XCAM_CFLAGS)
AC_SUBST(XCAM_CXXFLAGS)

# define macor in config.h
AC_DEFINE_UNQUOTED([ENABLE_PROFILING], $ENABLE_PROFILING,
    [enable profiling])

AC_DEFINE_UNQUOTED([HAVE_LIBDRM], $HAVE_LIBDRM,
    [have libdrm])
AM_CONDITIONAL([HAVE_LIBDRM], [test "$HAVE_LIBDRM" -eq 1])

AC_DEFINE_UNQUOTED([HAVE_LIBCL], $HAVE_LIBCL,
    [have libcl])
AM_CONDITIONAL([HAVE_LIBCL], [test "$HAVE_LIBCL" -eq 1])

AC_DEFINE_UNQUOTED([HAVE_GLES], $HAVE_GLES,
    [have gles])
AM_CONDITIONAL([HAVE_GLES], [test "$HAVE_GLES" -eq 1])

AC_DEFINE_UNQUOTED([HAVE_VULKAN], $HAVE_VULKAN,
    [have vulkan])
AM_CONDITIONAL([HAVE_VULKAN], [test "$HAVE_VULKAN" -eq 1])

AC_DEFINE_UNQUOTED([ENABLE_RENDER], $ENABLE_RENDER,
    [enable texture render])
AM_CONDITIONAL([ENABLE_RENDER], [test "$ENABLE_RENDER" -eq 1])

AC_DEFINE_UNQUOTED([HAVE_OPENCV], $HAVE_OPENCV,
    [have opencv])
AM_CONDITIONAL([HAVE_OPENCV], [test "$HAVE_OPENCV" -eq 1])

AC_DEFINE_UNQUOTED([ENABLE_DVS], $ENABLE_DVS,
    [enable dvs])
AM_CONDITIONAL([ENABLE_DVS], [test "$ENABLE_DVS" -eq 1])

AC_DEFINE_UNQUOTED([ENABLE_DVS_CL_PATH], $ENABLE_DVS_CL_PATH,
    [enable dvs cl path])
AM_CONDITIONAL([ENABLE_DVS_CL_PATH], [test "$ENABLE_DVS_CL_PATH" -eq 1])

AC_DEFINE_UNQUOTED([ENABLE_CAPI], $ENABLE_CAPI,
    [enable capi build])
AM_CONDITIONAL([ENABLE_CAPI], [test "$ENABLE_CAPI" -eq 1])

#atomisp
AM_CONDITIONAL([USE_LOCAL_ATOMISP], [test "$USE_LOCAL_ATOMISP" -eq 1])

# aiq (ia_imaging)
AC_DEFINE_UNQUOTED([HAVE_IA_AIQ], $ENABLE_IA_AIQ,
    [have aiq binary])
AM_CONDITIONAL([ENABLE_IA_AIQ], [test "$ENABLE_IA_AIQ" -eq 1])
AM_CONDITIONAL([USE_LOCAL_AIQ], [test "$USE_LOCAL_AIQ" -eq 1])

AC_CONFIG_FILES([Makefile
                 shaders/Makefile
                 shaders/clx/Makefile
                 shaders/glslx/Makefile
                 xcore/Makefile
                 modules/Makefile
                 modules/ocv/Makefile
                 modules/soft/Makefile
                 modules/isp/Makefile
                 modules/ocl/Makefile
                 modules/gles/Makefile
                 modules/vulkan/Makefile
                 modules/render/Makefile
                 wrapper/Makefile
                 wrapper/gstreamer/Makefile
                 wrapper/gstreamer/interface/Makefile
                 plugins/Makefile
                 plugins/3a/hybrid/Makefile
                 plugins/3a/aiq/Makefile
                 plugins/3a/Makefile
                 plugins/smart/Makefile
                 plugins/smart/dvs/Makefile
                 plugins/smart/dvs/libdvs/Makefile
                 plugins/smart/sample/Makefile
                 capi/Makefile
                 tests/Makefile
                 pkgconfig/Makefile
                 pkgconfig/libxcam.pc
                ])

AC_OUTPUT

if test "$HAVE_LIBDRM" -eq 1; then have_drm="yes"; else have_drm="no"; fi
if test "$USE_LOCAL_AIQ" -eq 1; then use_local_aiq="yes"; else  use_local_aiq="no"; fi
if test "$USE_LOCAL_ATOMISP" -eq 1; then use_local_atomisp="yes"; else  use_local_atomisp="no"; fi
if test "$HAVE_LIBCL" -eq 1; then have_libcl="yes"; else  have_libcl="no"; fi
if test "$HAVE_GLES" -eq 1; then have_gles="yes"; else  have_gles="no"; fi
if test "$HAVE_VULKAN" -eq 1; then have_vulkan="yes"; else  have_vulkan="no"; fi
if test "$HAVE_OPENCV" -eq 1; then have_opencv="yes"; else have_opencv="no"; fi
if test "$ENABLE_RENDER" -eq 1; then enable_render="yes"; else enable_render="no"; fi
if test "$ENABLE_DVS" -eq 1; then enable_dvs="yes"; else enable_dvs="no"; fi
if test "$ENABLE_CAPI" -eq 1; then enable_capi="yes"; else enable_capi="no"; fi

echo "
     libxcam configuration summary
     version                    : $XCAM_VERSION
     enable debug               : $enable_debug
     enable profiling           : $enable_profiling
     enable drm lib             : $have_drm
     build GStreamer plugin     : $enable_gst
     build aiq analyzer         : $enable_aiq
     use local aiq              : $use_local_aiq
     use local atomisp          : $use_local_atomisp
     enable OpenCV              : $have_opencv
     enable OpenCL              : $have_libcl
     enable GLES                : $have_gles
     enable Vulkan              : $have_vulkan
     enable OSG render          : $enable_render
     enable 3a lib              : $enable_3alib
     enable smart analysis lib  : $enable_smartlib
     enable dvs                 : $enable_dvs
     enable libxcam-capi lib    : $enable_capi
"
